package util

type Set[T comparable] struct {
	m map[T]struct{}
}

func NewSet[T comparable]() *Set[T] {
	return &Set[T]{
		m: make(map[T]struct{}),
	}
}

func (s *Set[T]) Add(value T) {
	s.m[value] = struct{}{}
}

func (s *Set[T]) AddValue(values []T) {
	if values != nil && len(values) > 0 {
		for i := 0; i < len(values); i++ {
			s.m[values[i]] = struct{}{}
		}
	}
}

func (s *Set[T]) Remove(value T) {
	delete(s.m, value)
}

func (s *Set[T]) RemoveValue(values []T) {
	if values != nil && len(values) > 0 {
		for i := 0; i < len(values); i++ {
			delete(s.m, values[i])
		}
	}
}

func (s *Set[T]) Contains(value T) bool {
	_, exists := s.m[value]
	return exists
}

func (s *Set[T]) Size() int {
	return len(s.m) // 返回 map 的长度
}

// Clear 清空集合
func (s *Set[T]) Clear() {
	s.m = make(map[T]struct{}) // 重新初始化 map，从而清空集合
}

// Elements 返回集合中的所有元素
func (s *Set[T]) Elements() []T {
	keys := make([]T, 0, len(s.m)) // 创建一个切片用于存储元素
	for key := range s.m {
		keys = append(keys, key) // 将 map 中的键（元素）添加到切片中
	}
	return keys
}
